// ES6 对正则表达式添加了u修饰符，含义为“Unicode 模式”，
// 用来正确处理大于\uFFFF的 Unicode 字符。
// 也就是说，会正确处理四个字节的 UTF-16 编码。
console.log(/^\uD83D/u.test('\D83D\DC2A'));
console.log(/^\uD83D/.test('\uD83D\uDC2A') );// true
/*
（1）点字符

点（.）字符在正则表达式中，含义是除了换行符以外的任意单个字符。
对于码点大于0xFFFF的 Unicode 字符，点字符不能识别，必须加上u修饰符。
*/ 
var s = '𠮷';

console.log(/^.$/.test(s)) // false
console.log(/^.$/u.test(s)) // true

/*
（3）量词

使用u修饰符后，所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。
*/ 
console.log(/a{2}/.test('aa'));
console.log(/a{2}/u.test('aa'));
console.log(/𠮷{2}/.test('𠮷𠮷'));
console.log(/𠮷{2}/u.test('𠮷𠮷'));

// （4）预定义模式

// u修饰符也影响到预定义模式，能否正确识别码点大于0xFFFF的 Unicode 字符。
console.log(/^\S$/.test('𠮷') ); //false
console.log(/^\S$/u.test('𠮷')) //true

/*
上面代码的\S是预定义模式，匹配所有非空白字符。
只有加了u修饰符，它才能正确匹配码点大于0xFFFF的 Unicode 字符。
*/
function codePointLength(text) {
    var result = text.match(/[\s\S]/gu);
    return result ? result.length : 0;
  }
  
  var s = '𠮷𠮷';
  
console.log(  s.length) // 4
console.log(  codePointLength(s)) // 2

// （5）i 修饰符
/*
有些 Unicode 字符的编码不同，但是字型很相近，
比如，\u004B与\u212A都是大写的K。
*/
console.log(/[a-z]/i.test('\u212A')); //false
console.log(/[a-z]/iu.test('\u212A') ); //true

/*
RegExp.prototype.unicode 属性
正则实例对象新增unicode属性，表示是否设置了u修饰符。
*/ 

const r1 = /hello/;
const r2 = /hello/u;

console.log(r1.unicode); // false
console.log(r2.unicode); //true